package com.location.footprint.overlay;

import android.content.Context;
import android.graphics.drawable.Drawable;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.location.footprint.R;
import com.location.footprint.bean.MapMarkerBean;
import com.location.footprint.utils.LogUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by my on 2016/12/19.
 */

public class MarkerOverlay {
    private List<LatLng> pointList = new ArrayList<LatLng>();
    private List<MapMarkerBean> mlist = new ArrayList<MapMarkerBean>();
    private AMap aMap;
    private LatLng centerPoint;
    private Marker centerMarker;
    private Marker directionMarker;
    private ArrayList<Marker> mMarkers = new ArrayList<Marker>();
    private Context context;

    public MarkerOverlay(AMap amap, LatLng centerpoint, Context context) {
        this.aMap = amap;
        this.centerPoint = centerpoint;
        this.context = context;
        if (centerMarker == null) {
            LogUtil.e("初始化中心点");
            initCenterMarker();
            initDirectionMarker();
        }


    }

    //初始化list
    public void initPointList(List<MapMarkerBean> list) {
        if (list != null && list.size() > 0) {
            mlist = list;
            pointList.clear();
            for (int i = 0; i < mlist.size(); i++) {
                pointList.add(mlist.get(i).getLatLng());
                getGlideBtimap(i);

            }
        }

    }

    private void getGlideBtimap(int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout_marker_avatar, null);
        ImageView circleImageView = view.findViewById(R.id.img_avatar);
        Glide.with(context)
                .load(mlist.get(i).getImgPath())
                .error(R.mipmap.ic_logo)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        circleImageView.setImageDrawable(resource);
                        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);
                        Marker marker = aMap.addMarker(new MarkerOptions()
                                .position(mlist.get(i).getLatLng())
                                .title("足迹" + i)
                                .icon(bitmap));
                        marker.setObject(i);
                        mMarkers.add(marker);
                        return false;
                    }
                })
                .into(circleImageView);

    }

    //初始化中心点Marker
    private void initCenterMarker() {
        this.centerMarker = aMap.addMarker(new MarkerOptions()
                .anchor(0.5f, 0.5f)
                .icon(BitmapDescriptorFactory
                        .fromResource(R.mipmap.dot_blue))
                .position(centerPoint)
                .title("中心点"));
    }

    public void setCenterMarker(int res) {
        this.centerMarker = aMap.addMarker(new MarkerOptions()
                .anchor(0.5f, 0.5f)
                .icon(BitmapDescriptorFactory
                        .fromResource(res))
                .position(centerPoint)
                .title("中心点"));
    }

    public Marker getCenterMarker() {
        return this.centerMarker;
    }

    /**
     * 设置方向圈
     */
    private void initDirectionMarker() {
        this.directionMarker = aMap.addMarker(new MarkerOptions()
                .anchor(0.5f, 0.5f)
                .icon(BitmapDescriptorFactory
                        .fromResource(R.mipmap.navi_direction))
                .position(centerPoint)
                .title("中心点方向圈"));
    }

    public Marker getDirectionMarker() {
        return this.directionMarker;
    }

    /**
     * 设置改变中心点经纬度
     *
     * @param centerpoint 中心点经纬度
     */
    public void setCenterPoint(LatLng centerpoint) {
        this.centerPoint = centerpoint;
        if (centerMarker == null) {
            initCenterMarker();
        } else {
            this.centerMarker.setPosition(centerpoint);
            centerMarker.setVisible(true);
        }


//        centerMarker.showInfoWindow();
    }

    /**
     * 设置改变中心点经纬度
     *
     * @param centerpoint 中心点经纬度
     */
    public void setFirstCenterPoint(LatLng centerpoint) {
        this.centerPoint = centerpoint;
        if (centerMarker == null) {
            initCenterMarker();
        }


//        centerMarker.showInfoWindow();
    }

    /**
     * 添加Marker到地图中。
     */
    public void addToMap() {
        try {
            for (int i = 0; i < pointList.size(); i++) {
                BitmapDescriptor bitmap = BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_GREEN);
                switch (i) {
                    case 2:
                        bitmap = BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW);
                        break;
                    case 4:
                        bitmap = BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_RED);
                        break;
                    default:

                        break;

                }
                Marker marker = aMap.addMarker(new MarkerOptions()
                        .position(pointList.get(i))
                        .title("厕所" + i)
                        .icon(bitmap));
                marker.setObject(i);
                mMarkers.add(marker);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 去掉MarkerOverlay上所有的Marker。
     */
    public void removeFromMap() {
        for (Marker mark : mMarkers) {
            mark.remove();
        }
        //保留centerMaker
//        centerMarker.remove();
    }

    /**
     * 缩放移动地图，保证所有自定义marker在可视范围中，且地图中心点不变。
     */
    public void zoomToSpanWithCenter() {
        if (pointList != null && pointList.size() > 0) {
            if (aMap == null)
                return;
            centerMarker.setVisible(true);
//            centerMarker.showInfoWindow();
            LatLngBounds bounds = getLatLngBounds(centerPoint, pointList);
            aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
        }
    }

    //根据中心点和自定义内容获取缩放bounds
    private LatLngBounds getLatLngBounds(LatLng centerpoint, List<LatLng> pointList) {
        LatLngBounds.Builder b = LatLngBounds.builder();
        if (centerpoint != null) {
            for (int i = 0; i < pointList.size(); i++) {
                LatLng p = pointList.get(i);
                LatLng p1 = new LatLng((centerpoint.latitude * 2) - p.latitude, (centerpoint.longitude * 2) - p.longitude);
                b.include(p);
                b.include(p1);
            }
        }
        return b.build();
    }

    /**
     * 缩放移动地图，保证所有自定义marker在可视范围中。
     */
    public void zoomToSpan() {
        if (pointList != null && pointList.size() > 0) {
            if (aMap == null)
                return;
            centerMarker.setVisible(false);
            LatLngBounds bounds = getLatLngBounds(pointList);
            aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
        }
    }

    /**
     * 根据自定义内容获取缩放bounds
     */
    private LatLngBounds getLatLngBounds(List<LatLng> pointList) {
        LatLngBounds.Builder b = LatLngBounds.builder();
        for (int i = 0; i < pointList.size(); i++) {
            LatLng p = pointList.get(i);
            b.include(p);
        }
        return b.build();
    }

    /**
     * 添加一个Marker点
     *
     * @param latLng 经纬度
     */
    public void addPoint(LatLng latLng) {
        pointList.add(latLng);
        Marker marker = aMap.addMarker(new MarkerOptions().position(latLng)
                .title("")
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
        marker.setObject(pointList.size() - 1);
        mMarkers.add(marker);
    }

    /**
     * 给第几个Marker设置图标，并返回更换图标的图片。如不用默认图片，需要重写此方法。
     *
     * @param index 第几个Marker。
     * @return 更换的Marker图片。
     * @since V2.1.0
     */
    protected BitmapDescriptor getBitmapDescriptor(int index) {
        return null;
    }

    /**
     * 返回第index的Marker的标题。
     *
     * @param index 第几个Marker。
     * @return marker的标题。
     * @since V2.1.0
     */
    protected String getTitle(int index) {
        return mMarkers.get(index).getTitle();
    }

    /**
     * 返回第index的Marker的详情。
     *
     * @param index 第几个Marker。
     * @return marker的详情。
     * @since V2.1.0
     */
    protected String getSnippet(int index) {
        return mMarkers.get(index).getSnippet();
    }

//    public float getDistance(int index) {
//        return mMarkers.get(index).getDistance();
//    }

    /**
     * 从marker中得到poi在list的位置。
     *
     * @param marker 一个标记的对象。
     * @return 返回该marker对应的poi在list的位置。
     * @since V2.1.0
     */
    public int getPoiIndex(Marker marker) {
        for (int i = 0; i < mMarkers.size(); i++) {
            if (mMarkers.get(i).equals(marker)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 返回第index的poi的信息。
     *
     * @param index 第几个poi。
     * @return poi的信息。poi对象详见搜索服务模块的基础核心包（com.amap.api.services.core）中的类 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的类">PoiItem</a></strong>。
     * @since V2.1.0
     */
    public Marker getMarker(int index) {
        if (index < 0 || index >= mMarkers.size()) {
            return null;
        }
        return mMarkers.get(index);
    }
}